/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/**
 *
 * @author antonio
 */


/**
 *  TankLink è uno spider per TheCubix.
 *  TankLink ha il compito di ricercare gli utenti all'interno del grafo rappresentate
 *  l'area sottoposta a controllo.
 *  Il programma ha due modi di funzionamento:
 *  - 1 - _RECURSIVE_ in cui si attraversa il grafo dell'edificio in modo ricorsivo
 *        si cercano tutti gli utenti presenti nei vari livelli di posizione
 *
 *  - 2 - _DIRECT_ si può puntare direttamente un utente di cui si conosce l'uri per controllare
 *        la posizione in cui questo si trova
 * 
 **/

import jargs.gnu.CmdLineParser;

public class TankLink {
  
    private static void printUsage()
    {
        System.err.println("Usage:[--mode recursive [{-g, --graph-uri} http://example.org:port] " +
                "[{-s, --graph-sub} http://example.org/nome_risorsa]" +
                "[{-l, --level} zero|uno|due] ]" +
                "[--mode direct [{-g, --graph-uri} http://example.org:port]" +
                "[{-u, --user-uri}] http://example.org/users'_uri]");
    }

    public static void main(String args[])
    {

        String stringMode = "UNDEFINED";
        String stringGraphUri = "UNDEFINED";
        String stringSubUri = "UNDEFINED";
        String stringLevel = "UNDEFINED";
        String stringUserUri = "UNDEFINED";

        int numLevel = 0;
        
        CmdLineParser parser = new CmdLineParser();

        //queste due opzioni definiscono il modo di funzionamento di TankLInk
        //_RECURSIVE_ cerca ricorsivamente tutti gli utenti in tutti gli edifici/piani/stanze
        //a seconda dal livello di zoom passatogli
        //_DIRECT_ invece contralla la posizione occupata di un utente specifico
        //la cui uri è stata passata da riga di comando

        CmdLineParser.Option mode = parser.addStringOption("mode");

        //queste opzioni sono condivise da entrambi i modi _RECURSIVE_ e _DIRECT_
        CmdLineParser.Option graphUri = parser.addStringOption('g', "graph-uri");  //uri del grafo che contiene le info da cercare

        //queste opzioni sono specifiche per _RECURSIVE_
        CmdLineParser.Option subUri = parser.addStringOption('s', "graph-sub");    //uri del livello da ricercare
        CmdLineParser.Option level = parser.addStringOption('l', "level");         //livello di partenza della ricerca

        //queste opzioni sono specifiche per _DIRECT_
        CmdLineParser.Option user = parser.addStringOption('u', "user-uri");

        
        try {
                parser.parse(args);
            }catch ( CmdLineParser.OptionException e ) {
                System.err.println(e.getMessage());
                printUsage();
                System.exit(2);
            }

        
        //tiro fuori dal parser le opzioni passate da riga di comando


        try{

            stringMode = (String)parser.getOptionValue(mode);

            if(stringMode.equals("recursive"))
            {
                stringGraphUri = (String)parser.getOptionValue(graphUri);
                stringSubUri = (String)parser.getOptionValue(subUri);
                stringLevel = (String)parser.getOptionValue(level);

                if(stringLevel.toString().equals("zero"))
                    numLevel = 0;
                else if(stringLevel.toString().equals("uno"))
                    numLevel = 1;
                else if(stringLevel.toString().equals("due"))
                    numLevel = 2;

                Cuber find = new Cuber(stringGraphUri, stringSubUri);
                find.executeRecursive(numLevel, stringSubUri);
            }
            else if(stringMode.equals("direct"))
            {
                stringGraphUri = (String)parser.getOptionValue(graphUri);
                stringUserUri = (String)parser.getOptionValue(user);

                Cuber find = new Cuber(stringGraphUri);
                find.executeDirect(stringUserUri);
            }

        }catch(NullPointerException e)
        {
            //stampo l'help nel caso non sia stata passata qualche opzione
            System.out.println("Syntax error: ");
            printUsage();
        }

  
        //Cuber find = new Cuber("http://localhost:8890/DAV/thecubix", "http://unime.it/thecubix/52");
        //find.execute(1, "http://unime.it/thecubix/52");
    }

}
